package com.drakulo.hi.logic.actors;

import java.util.HashMap;
import java.util.Map;

import com.dk.hi.core.actor.Attribute;
import com.dk.hi.core.actor.Lineament;
import com.drakulo.hi.gfx.Item;
import com.drakulo.hi.logic.inventory.Inventory;

public abstract class SomethingLiving {
	/**
	 * Nom
	 */
	private String name;

	/**
	 * Ses traits fixes
	 * 
	 * @see Lineament
	 */
	private Map<Lineament, Integer> lineaments;

	/**
	 * Ses attributs changeants (vie, xp, etc...)
	 * 
	 * @see Attribute
	 */
	private Map<Attribute, Integer> attributes;

	/**
	 * Son inventaire
	 */
	private Inventory inventory;

	/**
	 * Constructeur
	 * 
	 * @param p_name
	 *            - le nom de la chose
	 */
	public SomethingLiving(String p_name) {
		super();
		setName(p_name);
		this.lineaments = new HashMap<Lineament, Integer>();
		this.attributes = new HashMap<Attribute, Integer>();
		this.inventory = new Inventory();
	}

	/**
	 * @param p_attribute
	 *            - l'attribut
	 * @return La valeur de l'attribut
	 */
	public Integer getAttribute(Attribute p_attribute) {
		return this.attributes.get(p_attribute);
	}

	/**
	 * @param p_lineament
	 *            - le trait
	 * @return La valeur du trait
	 */
	public Integer getLineament(Lineament p_lineament) {
		return this.lineaments.get(p_lineament);
	}

	public Map<Lineament, Integer> getLineaments() {
		return this.lineaments;
	}

	public String getName() {
		return this.name;
	}

	/**
	 * Ajoute un objet dans l'inventaire
	 * 
	 * @param p_item
	 */
	public void putItemInInventory(Item p_item) {
		// inventory.add(p_item);
	}

	/**
	 * Initialise un attribut
	 * 
	 * @param p_attribute
	 *            - l'attribut
	 * @param p_value
	 *            - sa valeur
	 */
	public void setAttribute(Attribute p_attribute, Integer p_value) {
		// TODO tester la nullité des paramètres
		this.attributes.put(p_attribute, p_value);
	}

	/**
	 * Ajoutes tous les attributs de la map
	 * 
	 * @param p_attributes
	 *            - les attributs à ajouter
	 */
	protected void setAttributes(Map<Attribute, Integer> p_attributes) {
		this.attributes.putAll(p_attributes);
	}

	/**
	 * Initialise un trait
	 * 
	 * @param p_lineament
	 *            - le trait
	 * @param p_value
	 *            - sa valeur
	 */
	public void setLineament(Lineament p_lineament, Integer p_value) {
		// TODO tester la nullité des paramètres
		this.lineaments.put(p_lineament, p_value);
	}

	/**
	 * Ajoute tous les traits de la map
	 * 
	 * @param p_lineaments
	 *            - Traits à ajouter
	 */
	protected void setLineaments(Map<Lineament, Integer> p_lineaments) {
		this.lineaments.putAll(p_lineaments);
	}

	public void setName(String name) {
		this.name = name;
	}

}
